import axios from 'axios';
function calculateFundPerformance(buy_shell, infow, time) {
  // 1. 交易记录按时间升序排序
  buy_shell.sort((a, b) => new Date(a.time) - new Date(b.time));

  // 2. 构建交易映射表（日期 -> 交易列表）
  const transactionsByDate = {};
  for (const trans of buy_shell) {
      if (!transactionsByDate[trans.time]) {
          transactionsByDate[trans.time] = [];
      }
      transactionsByDate[trans.time].push(trans);
  }

  // 3. 初始化变量
  let totalCost = 0;        // 总成本（总投入 - 总赎回）
  let currentShares = 0;    // 当前持有份额
  let currentNav = 1;       // 当前净值，初始为1
  const results = [];       // 存储每日结果

  // 4. 按时间顺序处理每个日期
  for (let i = 0; i < time.length; i++) {
      const date = time[i];
      const dailyChange = parseFloat(infow[i]) / 100;

      // 4.1 处理当天的交易
      if (transactionsByDate[date]) {
          for (const trans of transactionsByDate[date]) {
              totalCost += trans.money;
              currentShares += trans.num;
          }
      }

      // 4.2 应用当天的涨跌幅
      currentNav *= (1 + dailyChange);

      // 4.3 计算当前价值与盈亏
      const currentValue = currentShares * currentNav;
      const profitLoss = currentValue - totalCost;

      // 4.4 存储结果
      results.push({
          date,
          totalCost: totalCost.toFixed(2),
          currentShares: currentShares.toFixed(2),
          currentValue: currentValue.toFixed(2),
          profitLoss: profitLoss.toFixed(2)
      });
  }

  return results;
}
//数据来源
//https://gw.datayes.com/robowm/mobile/whitelist/fund/mkt/nav/curve?fundCode=002190&holdMonth=12
export function dealBugShellData(indexfun1,res){
   // 初始化计算变量
  //  console.log("indexfun22221===", indexfun1);  
    const dealflowMap = new Map(res.map((item, i) => [item.time, { item, index: i }]));
   let getChenBen=calculateFundPerformance(res,indexfun1.inflow.map(Number),indexfun1.time)

  // const  dealCBTime= new Map(getChenBen.map((item, i) => [item.date, { item, index: i }]));


   // bug_shell_all_data=总资金变化，shell_cben=成本
   let [bug_shell_all_data, shell_cben] = [0, 0];
   // bug_shell_data=每天的买入卖出操作记录
   const [bug_shell_data, bug_shell_all_data_array] = [[], []];
   let remaining_loss=0;//剩余亏损
   let remaining_profit=[];//剩余盈利
   let profitLossRatio=[] //盈亏率
   let day_loss_profit=[] //每日盈亏;
   let shell_cben_array=[] //成本数组
  
   // 主计算逻辑
   indexfun1.time.forEach((time, index) => {
     const prevInflow = index > 0 ? indexfun1.inflow[index - 1] : 0;
     const growthFactor = (100 + (indexfun1.inflow[index] - prevInflow)) / 100;
    // const growthFactor=(100+that.indexfun1.array[index])/100  ///也是计算每天涨跌幅
     //判断是不是有这个时间
     const match = dealflowMap.get(time);
     let cs_this=0;
     let day_loss_this=0;//
    //  if(dealCBTime.get(time)){
    //   shell_cben=dealCBTime.get(time).item.cost
    //  }else{
    //   shell_cben=0
    //  }  
   
     if (match) {
       const { item } = match;
       shell_cben =shell_cben+ item.num;//亏损不应该负数，赚钱才可能存在负数
       bug_shell_data.push(item.num);
       let this_buy_num= +(bug_shell_all_data * growthFactor + item.num).toFixed(4);
       // 判断在卖出之后小于0 的情况下怎么办,判断是不是清仓了
       if(this_buy_num<=0){
         //判断是亏钱还是赚钱,小于0是赚钱，大于0 是亏钱，1000-1280=-280，是赚钱
         if(shell_cben>0){}
         remaining_loss=remaining_loss+-shell_cben;//记录剩余的亏损
         day_loss_this=remaining_loss
         cs_this=-shell_cben/(shell_cben-item.num);//当前值-成本才知道是赚钱还是亏损
         bug_shell_all_data=0;//清仓
       }else{ 
         ///是不是需要把买入当天也计算为买入价格。
         bug_shell_all_data = bug_shell_data.length === 1? item.num
           :this_buy_num;
         if(remaining_loss!=0){ //判断是亏钱还是赚钱,小于0是赚钱，大于0 是亏钱，1000-1280=-280，是赚钱
             if(remaining_loss>0){}
             cs_this= (bug_shell_all_data+remaining_loss)/shell_cben
         }
         day_loss_this=bug_shell_all_data-shell_cben+remaining_loss
       }
      
     } else {
       //使用一元 + 可以将字符串转换为数字：
       bug_shell_data.push(0);
       bug_shell_all_data = bug_shell_all_data!=0
         ? +(bug_shell_all_data * growthFactor).toFixed(4)
         : 0;
         //计算盈亏的数组
       cs_this=bug_shell_all_data/shell_cben
       cs_this = isNaN(cs_this) ? 0 : cs_this;
       day_loss_this=bug_shell_all_data-shell_cben+remaining_loss
     }
     day_loss_profit.push(day_loss_this.toFixed(4))
     profitLossRatio.push(+(( cs_this )*100).toFixed(4))
     shell_cben_array.push(shell_cben.toFixed(4))
     bug_shell_all_data_array.push(bug_shell_all_data);
     remaining_profit.push(((
      parseFloat( day_loss_this) /  parseFloat(shell_cben) 
    )*100).toFixed(2))
   });
//    console.log("盈亏变化===", day_loss_profit);
//    console.log("shell_profitLossRatiocben===", profitLossRatio);
//    console.log("shell_cben===", shell_cben);
  return {
    bug_shell_all_data_array,
    bug_shell_data,
    shell_cben,
    profitLossRatio,
    shell_cben_array,
    day_loss_profit,
    remaining_loss,
    remaining_profit
  }
}
//获取基金数据
// 获取基金数据
export async function getFundData(code_num) {
  console.log("datadatadata===",code_num)
  code_num=getFunNameCode(code_num)
  try {
    // 第一步：获取`数据

   const url1 = `https://gw.datayes.com/robowm/mobile/whitelist/fund/mkt/nav/curve?fundCode=${code_num}&holdMonth=`
    //`https://hq.chongnengjihua.com/go-fund-server/api/1/fund/indexProfitTrend?secucode=${code_num}&indexcode=000300&cycle=999`
  
    const res1 = await axios.get(url1);
 
    const data = res1.data.data.portfolio;
    
    let time_array=[];
    let num_array=[];
    let inflow=[];
    let zdf=0;

     data.forEach((item,index) => {
      time_array.push(item.date)
      let chg=item.chg*100;
    
      let values=0;
      if(index!=0){
         values=((item.value-data[index-1].value)/data[index-1].value)*100;
      }
      zdf=zdf+values;
      num_array.push(values.toFixed(2) )
      inflow.push(zdf.toFixed(2))
    });

    // 第二步：获取补充数据并合并
    return await getEndData(time_array,inflow,code_num,num_array);
  } catch (error) {
    console.error('获取基金数据失败:', error);
    throw error; // 将错误抛给调用者处理
  }
}
// 获取补充数据并合并到现有数据中
async function getEndData(time_array,num_array,code_num,num_array2) {
  try {
   // const url1 = `https://www.dayfund.cn/ajs/ajaxdata.shtml?showtype=getfundvalue&fundcode=${code_num}`;
  const url1 =`https://api.etf88.com/fundcode/getfundguzhizhangfuzoushi?fundcode=${code_num}`
    const res = await axios.get(url1);
 
    const result = res.data.data //res.data.split('|');
   if(result){
      const endData = {
        time:result.gzrq, //result[9],
        num: parseFloat(result.result[result.result.length-1].gzzf),
      };
      // 如果最新日期与已有数据不同，则添加到数组末尾
      if (time_array[time_array.length - 1].time !== endData.time) {
        num_array2.push(endData.num)
        endData.num = endData.num + parseFloat(num_array[num_array.length - 1]);
        time_array.push(endData.time)
        num_array.push(endData.num+'')
      }
    }
    return {time_array,num_array,num_array2};
  } catch (error) {
    console.error('获取补充数据失败:', error);
    throw error;
  }
}
function getFunNameCode(name){
  switch (name) {
    case '新能源':
      return '002190';
    case '中证白酒':
      return '005827';
    case '恒生医疗保健指数':
      return '006229';
  }
}
export default { dealBugShellData,getFundData };
//处理买入卖出的工具